﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Linq; //ESTE USING esta repedido 3 lineas arriba -------------------------------------------!!!!!!!!!
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;

namespace ForrajeriaDAL
{
    public class TipoDocumentoDAL : AccesoDAL, InterfazDAL<TipoDocumentoMO>
    {

        #region VARIABLES PARA STORED QUE MANEJA EL OBJETO DE DAL


        private static string insert = "TipoDocumento_INSERT_RETURN_Scalar";
        private static string delete = "TipoDocumento_DELETE";
        private static string update = "TipoDocumento_UPDATE";
        private static string all = "TipoDocumento_GetALL";

        #endregion



        private SqlCommand cmd; //var de comando sql

        #region "Singleton"

        private static TipoDocumentoDAL instance;

        private TipoDocumentoDAL()
            : base()
        {
            
        }


        public static TipoDocumentoDAL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new TipoDocumentoDAL();
                }
                return instance;
            }
        }

        #endregion


        #region Interfaz
        public List<TipoDocumentoMO> GetAll()
        {
            SqlDataReader reader = null;
           List<TipoDocumentoMO> lista = new List<TipoDocumentoMO>();
           try
           {

               cmd = new SqlCommand(all, getConexion());
               cmd.CommandType = CommandType.StoredProcedure;
               opencon(); // abre coneccion 
               reader = cmd.ExecuteReader();
               while (reader.Read())
               {

                   TipoDocumentoMO aux = new TipoDocumentoMO();
                   aux.Codigo = int.Parse(reader["codigo"].ToString());
                   aux.TipoDocumento1 = reader["TipoDocumento"].ToString();
                   lista.Add(aux);

               }
               return lista;
           }
           catch (Exception ex)
              
           {
               closecon();// cierra conexion
               throw ex; //en caso que no pueda leer desde la base de datos tira el hacia la siguiente capa 
           }
           finally //finalmente cierro el reader que use para traer la consulta esto es importante ya que por alguna razon podria quedar abierto generando una conexion sin uso en la bd que estaria todo el tiempo abierta
           {
               closeReader(reader);
               closecon();// cierra conexion
               
           }

        }

        public void Adicionar(TipoDocumentoMO item)
        {
            try
            {
                cmd = new SqlCommand(insert, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;


                //Agregando parametro de direccion OUTPUT para el retorno del SP
                SqlParameter  codigo = new SqlParameter("@codigo", SqlDbType.Int);
                codigo.Direction = ParameterDirection.Output;
   

                //agregando parametro de Insercion necesario para el SP 
                cmd.Parameters.Add("@tipoDocumento", SqlDbType.VarChar,10).Value = item.TipoDocumento1;
                cmd.Parameters.Add(codigo);
                
                

                opencon(); //abro conexion
                cmd.ExecuteNonQuery();
                closecon(); //cierra conexion

            }
            catch (SqlException ex)
            {
                closecon();
                throw ex;
            }
        }

        public void Eliminar(TipoDocumentoMO item)
        {
            try
            {
                cmd = new SqlCommand(delete, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = item.Codigo;

                opencon();
                cmd.ExecuteNonQuery();
                closecon();
            }
               
            catch (SqlException ex)
            {
                closecon();
                throw ex;
                
            }

         
        }

        public void Actualizar(TipoDocumentoMO nuevoItem, TipoDocumentoMO origItem)
        {
            try
            {
                cmd = new SqlCommand(update, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = origItem.Codigo;
                cmd.Parameters.Add("@tipoDocumento", SqlDbType.VarChar, 10).Value = nuevoItem.TipoDocumento1;

                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (SqlException ex)
            {
                closecon();
                throw ex;
            }
        }

        #endregion



    }


}
